package com.java.core1.chapter3;

/**
 * @author ClearScenery
 * @version 创建时间：2019年2月18日 下午1:54:35
 * @ClassName Demo2
 * @Description 了解Java的基本数据类型
 */
public class Demo2 {
	public static void main(String[] args) {
		//整型
		//byte b = 1;  //占1字节，8位二进制数，-128-127
		//short s = 1;   //占2字节，16位二进制数，-32768-32767
		//int i = 1;    //占4字节，32位二进制数，-2 147 483 648-2 147483647(正好超过 20亿)，位数能存40多亿状态
		//long l = 1;   //占8字节，64位二进制数，-9 223 372 036 854 775 808-9 223 372 036 854 775 807
		
		//浮点型
		float f = 1.3F;//4字节,大约 ±3.402 823 47E+38F(有效位数为 6 ~ 7 位），java默认浮点型是double，所以要加F/f
		double d = 1.3;//8字节，大约 ±1.797 693 134 862315 70E+308 (有效位数为 15 位)
		
		//浮点型
		float ff = 1.5F;//4字节,大约 ±3.402 823 47E+38F(有效位数为 6 ~ 7 位），java默认浮点型是double，所以要加F/f
		double dd = 1.5;//8字节，大约 ±1.797 693 134 862315 70E+308 (有效位数为 15 位)
		
		/*
		 * 1.3转成二进制为1.0100110011001100110011001100110011001100110011001101
		 * float存储精度丢失
		 * double的精度是float的二倍，存的值比float多（可存float的二倍）
		 */
		System.out.println("1.3转成二进制为1.0100110011001100110011001100110011001100110011001101");
		System.out.print("(float)1.3F == (double)1.3    结果：");
		System.out.println(f == d);//false
		
		/*
		 * 1.5转成二进制为1.1
		 * float和double都能存下
		 */
		System.out.println("1.5转成二进制为1.1");
		System.out.print("(float)1.5F == (double)1.5    结果：");
		System.out.println(ff == dd);//false
		
		//测试float有效位后精度不准确
		float f1 = 1.0000001F;//小数点后7位
		float f2 = 1.0000000F;//小数点后7位
		float f3 = 1.00000001F;//小数点后8位
		float f4 = 1.00000000F;//小数点后8位
		
		System.out.print("(小数点后7位)1.0000001F == 1.0000000F   结果：");
		System.out.println(f1 == f2);
		System.out.print("(小数点后8位)1.00000001F == 1.00000000F   结果：");
		System.out.println(f3 == f4);
		
		//测试double有效位后精度不准确
		double d1 = 1.000000000000001;//小数点后15位
		double d2 = 1.000000000000000;//小数点后15位
		
		double d3 = 1.0000000000000001;//小数点后16位
		double d4 = 1.0000000000000000;//小数点后16位
		
		System.out.print("(小数点后15位)1.000000000000001 == 1.000000000000000     结果：");
		System.out.println(d1 == d2);//false
		System.out.print("(小数点后16位)1.0000000000000001 == 1.0000000000000000    结果：");
		System.out.println(d3 == d4);//true
		
		//double,float类型的值如何进行比较
		//1、转换为整数比较
		int intBits1 = Float.floatToIntBits(f1);
		int intBits2 = Float.floatToIntBits(f2);
		
		System.out.println(intBits1 == intBits2);
		
		int intBits3 = Float.floatToIntBits(f3);
		int intBits4 = Float.floatToIntBits(f4);
		
		System.out.println(intBits3 == intBits4);
		
//		long longBits1 = Double.doubleToLongBits(d1);
//		long longBits2 = Double.doubleToLongBits(d2);
		
//		System.out.println(longBits1 == longBits2);
	}
}
